/*
    *   Title:      FileEdit
    *   Author:     Damian Roberts
    *   Copyright:  (C) Archimedes World 1992   
*/

#define VERSION "0.92"  /*  4-7-92 */

    
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "swis.h"

#include "os.h"
#include "wimp.h"
#include "wimpt.h"
#include "win.h"
#include "res.h"
#include "template.h"
#include "baricon.h"
#include "event.h"
#include "menu.h"
#include "dbox.h"
#include "bbc.h"
#include "werr.h"
#include "resspr.h"
#include "time.h"
#include "msgs.h"
#include "math.h"
#include "float.h"

#define space    ' '
#define linefeed '\n'
#define c_return '\x0d'

/************************************************/
/*                  constants                   */
/************************************************/

#define APP_NAME            "Repay"
#define ICON_NAME           "!Repay"





#define cd_info_field       3

#define SETTLE_SWITCH       6
#define REPAY_SWITCH        7

#define OK_FIELD            0
#define TOTAL_FIELD         1
#define APR_FIELD           2
#define NO_FIELD            3
#define REPAYMENT_FIELD     4
#define SETTLEMENT_FIELD    5

#define REPAY               1
#define SETTLE              2

/***************************************************************************/


/***************************************/
/********* global variables   **********/
/***************************************/

dbox main_dbox;

menu i_menu;

BOOL    dbox_opened = FALSE;


char    app_dir[256];

double  total_ammount;
double  apr;
double  settlement;
double  repayments;
double  number_payments;

int     calc_mode;


/***************************************/

void double_to_string(double source,char target[256],int digits)
{

    double pow1,temp1,temp2;
    int count;
    int point = 0;
 
    pow1 = floor(log10(source));
    temp1 = pow(10, pow1);
    
    if(temp1 == 0)
    {
        strcpy(target,"0.0");
        return;
    }
    
    temp2 = source / temp1;
    
    if(source < 0)      /* negative number*/
        {
        target[point] = '-';
        point++;
        }
    
    pow1++;
    
    for(count = 1;count < pow1+digits;count++)
    {
    target[point] = 48 + floor(temp2);
    point++;
    
    if(count == pow1)
        {
        target[point] = '.';
        point++;
        }
            
    temp2 = (temp2 - floor(temp2)) * 10;
    }
    
    target[point] = 0;        
    target = strcat(target,"   ");
    
 
}

/******************************/


void calculate(void)
{

    char buffer[256];
    double  temp_apr;
    double  total_repay;
    double  temp_t = 1/12;    

    int q;
    
    dbox_getfield(main_dbox,TOTAL_FIELD,buffer,25);
    total_ammount = strtod(buffer,0);
   
    dbox_getfield(main_dbox,APR_FIELD,buffer,25);
    apr = strtod(buffer,0);

    dbox_getfield(main_dbox,REPAYMENT_FIELD,buffer,25);
    repayments = strtod(buffer,0);

    dbox_getfield(main_dbox,NO_FIELD,buffer,25);
    number_payments = strtod(buffer,0);

    dbox_getfield(main_dbox,SETTLEMENT_FIELD,buffer,25);
    settlement = strtod(buffer,0);
    
            

    temp_apr = exp(log(1 + apr / 100) / 12);

    if( calc_mode == REPAY ) 
    {       
        temp_t = pow(temp_apr,number_payments);

        
        total_repay = temp_t * total_ammount;
        
        temp_t = 1;
        for(q = 1; q < number_payments; q++)
            {
            temp_t=temp_t + pow(temp_apr,q);
            }
            
        repayments = total_repay/temp_t;
                
        double_to_string(repayments,buffer,2);

        dbox_setfield(main_dbox,4,buffer);
       

    }
        
    if( calc_mode == SETTLE )
    {
        settlement = total_ammount;
        for( q = 1; q <  number_payments+1;q++)
        {
        settlement = (settlement * temp_apr) - repayments;
        }
        
        double_to_string(settlement,buffer,2);

        dbox_setfield(main_dbox,5,buffer);
    }

}

/*************** info box **************/

void cd_info_about_program(void)
{   

    
    dbox  d;
    char   versionstring[256];

    if ((d = dbox_new("info")) != NULL)
    {
        sprintf(versionstring,"%s (%s)",VERSION,__DATE__);
        dbox_setfield(d, cd_info_field, versionstring);
        
        dbox_show(d);
        dbox_fillin(d);
        dbox_dispose(&d);
     }
     
}

/***************************************************************************/

void main_dbox_handler(dbox d, void *handle)
{

    int field;
    
    handle = handle;
    
    field = dbox_get(d);
    
    
    switch(field)
    {
        case OK_FIELD:
            calculate();
            break;
            
        case dbox_CLOSE:        
            dbox_hide(main_dbox);
            dbox_opened = FALSE;
            break;
            
        case SETTLE_SWITCH:
            dbox_setnumeric(main_dbox,REPAY_SWITCH,0);
            dbox_setnumeric(main_dbox,SETTLE_SWITCH,1);
            calc_mode = SETTLE;
            dbox_unfadefield(main_dbox,SETTLEMENT_FIELD);
            break;

        case REPAY_SWITCH:
            dbox_setnumeric(main_dbox,REPAY_SWITCH,1);
            dbox_setnumeric(main_dbox,SETTLE_SWITCH,0);
            calc_mode = REPAY;
            dbox_fadefield(main_dbox,SETTLEMENT_FIELD);
            dbox_setfield(main_dbox,SETTLEMENT_FIELD,"  ");
            break;
    }
    
}


/***************************************************************************/

void iconbar_click_handler(wimp_i icon)
{
    icon = icon;
    
    if(!dbox_opened)
        {
        dbox_setnumeric(main_dbox,6,0);
        dbox_setnumeric(main_dbox,7,1);            
        dbox_fadefield(main_dbox,SETTLEMENT_FIELD);
        dbox_setfield(main_dbox,SETTLEMENT_FIELD,"  ");
        dbox_opened = TRUE;
        calc_mode = REPAY;
        }
        
    dbox_showstatic(main_dbox);
    dbox_eventhandler(main_dbox,main_dbox_handler,0);
    
 
}


/***************************************************************************/


void i_menu_handler(void *handle, char *hit)
{
  handle = handle;

  switch(hit[0])
  {
    case 1:
        cd_info_about_program();
        break;        

    case 2:
      exit(0);
      break;
  }
}

/**********************************************/


static BOOL initialise(void)
{
    os_read_var_val("Obey$Dir",app_dir,255);
    if (*app_dir=='\0') return FALSE;
    

  wimpt_init(APP_NAME);
  res_init(APP_NAME);
  resspr_init();
  template_init();
  dbox_init();
  msgs_init();
  
/********** put icon on icon bar  ************/
  
    if((main_dbox = dbox_new("main")) == NULL)
        return(FALSE);
        
    

    if ((i_menu = menu_new(APP_NAME,msgs_lookup("menu1"))) == NULL)
    return FALSE;
    
   

    

    baricon(ICON_NAME, (int)resspr_area(), iconbar_click_handler);
    

    if(!event_attachmenu(win_ICONBAR,i_menu,i_menu_handler,0))
        return(FALSE);
      

        
       

  return TRUE;
}

/**************************************************/

int main(int argc, char *argv[])
{
  argc = argc;
  argv = argv;

  if (!initialise())
    exit(1);



  while(TRUE)
    event_process();

  return 0;
}

